package com.alibaba.bos.action.base;

import java.io.File;
import java.io.FileInputStream;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang3.StringUtils;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;

import com.alibaba.bos.domain.base.Area;
import com.alibaba.bos.service.base.AreaService;
import com.alibaba.bos.utils.PinYin4jUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@Controller
@Namespace("/")
@ParentPackage("json-default")
@Scope("prototype")
public class AreaAction extends ActionSupport implements ModelDriven<Area>{

    
    private static final long serialVersionUID = 1L;

    private Area area=new Area();
    @Override
    public Area getModel() {
        return area;
    }
    
    @Autowired
    private AreaService areaService;
    
    //接受上传文件
    private File file;
    
    public void setFile(File file) {
        this.file = file;
    }
    
    //批量导入，读取excel文件
    @Action(value="area_batchImport")
    public String batchImport() throws IOException{
        //将area存入集合
        List<Area> areas=new ArrayList<Area>(); 
        //加载excel对象
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(file));
        //读取一个sheet(HSSFSheet实现sheet接口，而sheet继承了Iterable)
        HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
       //读取每一行
        for (Row row : sheet) {
           //跳过第一行
           if(row.getRowNum()==0){
               continue;
           }
           //跳过空行
           //
           if(row.getCell(0)==null || 
                   StringUtils.isBlank(row.getCell(0).getStringCellValue())){
               continue;
           }
           Area area = new Area();
           area.setId(row.getCell(0).getStringCellValue());
           area.setProvince(row.getCell(1).getStringCellValue());
           area.setCity(row.getCell(2).getStringCellValue());
           area.setDistrict(row.getCell(3).getStringCellValue());
           area.setPostcode(row.getCell(4).getStringCellValue());
           //生成城市编码 ，全拼
           String province=area.getProvince();
           String city=area.getCity();
           String district=area.getDistrict();
           province=province.substring(0, province.length()-1);
           city=city.substring(0, city.length()-1);
           district=district.substring(0, district.length()-1);
           //简码
           String[] headArray=PinYin4jUtils.getHeadByString(province+city+district);
           StringBuffer buffer=new StringBuffer();
           for (String head : headArray) {
               buffer.append(head);
           }
           String shortCode=buffer.toString();
           area.setShortcode(shortCode);
           //城市编码（只需要城市的全拼，不需要省份的拼音）
           String cityCode=PinYin4jUtils.hanziToPinyin(city,"");
           area.setCitycode(cityCode);
           areas.add(area);
       }
       //调用业务层
       areaService.saveBatch(areas);
       return NONE;
    }
    //属性驱动
    private int page;
    private int rows;
    
    public void setPage(int page) {
        this.page = page;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    //根据Specification带条件分页查询
    @Action(value="area_pageQuery",results={@Result(name="success",type="json" )})
    public String pageQuery(){
        //获取pageable对象
        Pageable pageable=new PageRequest(page-1, rows);
        //获取Specification对象
        Specification<Area> specification=new Specification<Area>() {

            @Override
            public Predicate toPredicate(Root<Area> root, CriteriaQuery<?> query,
                    CriteriaBuilder cb) {
                List<Predicate> pres=new ArrayList<>();
                if(StringUtils.isNotBlank(area.getProvince())){
                    Predicate p1=cb.like(root.get("province").as(String.class),
                            "%"+area.getProvince()+"%");
                    pres.add(p1);
                }
                if(StringUtils.isNotBlank(area.getCity())){
                    Predicate p2=cb.like(root.get("city").as(String.class),
                            "%"+area.getCity()+"%");
                    pres.add(p2);
                }
                if(StringUtils.isNotBlank(area.getDistrict())){
                    Predicate p3=cb.like(root.get("district").as(String.class),
                            "%"+area.getDistrict()+"%");
                    pres.add(p3);
                }
                return cb.and(pres.toArray(new Predicate[0]));
            }
        };
        
        //调用业务层获取数据
        Page<Area> pages=areaService.findPageData(specification,pageable);
        //使用map得到相应的数据格式
        Map<String, Object> page=new HashMap<>();
        page.put("rows", pages.getContent());
        page.put("total", pages.getTotalElements());
        System.out.println(page);
        //压入值栈
        ActionContext.getContext().getValueStack().push(page);
        return SUCCESS;
    }
    
    //显示数据
   /* @Action(value="",results={@Result(name="success",location="./pages/base/area.html")})
    public String findAll(){
        List<Area> areas=areaService.findAll();
        ActionContext.getContext().getValueStack().push(areas);
        return SUCCESS;
    }*/
}
